package com.binc.testspring.study.design.observer;

import java.util.Arrays;
import java.util.Observer;
import java.util.Vector;

/**
 * FileName: TestObserver  观察者模式  订阅模式
 *
 * 这里推荐用抽象类 而不是说接口了
 *
 * 关键点就是在被观察的对象里聚合一个 观察者的集合
 *
 * Autho: binC
 * Date:  2022/3/31 19:03
 */
public class TestObserver {

    public static void main(String[] args) {
        Binc_Observer weixin = new WeixinObServer();
        Binc_Observer ali = new AliObServer();
        Subject sub = new ConcreteSubject1();
        sub.add(weixin);
        sub.add(ali);

        sub.subjectDo_1();
        System.out.println("___________________________");
        sub.subjectDo_2();

    }

}


// 抽象被观察者(主题  被订阅者)   推荐用抽象类  因为有普通方法了；
// 抽象类中维护几个方法，这几个方法 被观察者中聚合的观察者对象集合的   主要就是 添加  删除的操作；
abstract  class Subject {
    private Vector<Binc_Observer> vector = new Vector();

    // public void add(Object obj){ // 这里用object类型其实也可以，但是这里更推荐用观察者的抽象类型
    public void add(Binc_Observer ob){
        vector.add(ob);
    }

    public void remove(Observer observer){
        this.vector.remove(observer);
    }

    public void notifyObservers(Object... objs){
        for (Binc_Observer observer : vector) {
            observer.obDoSomething(objs); // 挨个通知观察者们
        }
    }

    /********下面是抽象类的抽象方法，需要具体被观察者去重写的*********/
    abstract void subjectDo_1();
    abstract void subjectDo_2();


}

// 具体的被观察者者1    具体的主题
class ConcreteSubject1 extends  Subject{

    /********下面是抽象类的抽象方法，需要具体被观察者去重写的*********/
    @Override
    void subjectDo_1() {
        System.out.println("被观察者执行了方法1....");
        super.notifyObservers("1");//调用父类方法，通知所有的观察者们
    }

    @Override
    void subjectDo_2() {
        System.out.println("被观察者执行了方法22222....");
        super.notifyObservers("2");//调用父类方法，通知所有的观察者们
    }
}


/**************************************/
// 观察者抽象接口
interface Binc_Observer{
    void obDoSomething(Object... objects);
}

//具体观察者1
class WeixinObServer implements Binc_Observer {
    @Override
    public void obDoSomething(Object... objects) {
        System.out.println("微信观察者得到通知了,参数是【"+ Arrays.toString(objects)+"】");
    }
}
//具体观察者2
class AliObServer implements  Binc_Observer{
    @Override
    public void obDoSomething(Object... objects) {
        System.out.println("阿里观察者得到通知了，参数是【"+ Arrays.toString(objects)+"】");
    }
}

